- 
                Notifications
    
You must be signed in to change notification settings  - Fork 5
 
feat: experimental typescript-nextjs template #152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
54335e8    to
    3033f06      
    Compare
  
    adds https://github.com/mnahkies/openapi-code-generator/ / https://openapi-code-generator.nahkies.co.nz/ to the list. it currently supports generating typescript client sdks based on fetch / axios, and server routing / request+response validation based on koa (choice of zod / joi for runtime validation). an experimental nextjs server implementation is in the works (mnahkies/openapi-code-generator#152), and my longer term plan is to add other languages such as kotlin to the set of templates.
3033f06    to
    58f706b      
    Compare
  
    fd15300    to
    258f9ab      
    Compare
  
    258f9ab    to
    aedad74      
    Compare
  
            
          
                packages/openapi-code-generator/src/typescript/typescript-nextjs/typescript-nextjs.generator.ts
              
                Fixed
          
            Show fixed
            Hide fixed
        
      9603fcd    to
    c47b5cb      
    Compare
  
    c47b5cb    to
    2e6b6f2      
    Compare
  
    | paths.includes(relative), | ||
| ) | ||
| 
               | 
          ||
| return alias ? alias[0].replace("*", "") : undefined | 
Check failure
Code scanning / CodeQL
Incomplete string escaping or encoding High
          
            
              
                
              
            
            Show autofix suggestion
            Hide autofix suggestion
          
      Copilot Autofix
AI 4 months ago
To fix the issue, we need to ensure that all occurrences of "*" in the string are replaced. This can be achieved by using a regular expression with the global flag (g) instead of a string argument in replace. Specifically, replacing alias[0].replace("*", "") with alias[0].replace(/\*/g, "") ensures that every occurrence of "*" is replaced by an empty string, addressing the incomplete escaping issue.
No additional imports or external dependencies are required for this fix.
- 
    
    
    
Copy modified line R22  
| @@ -19,7 +19,7 @@ | ||
| paths.includes(relative), | ||
| ) | ||
| 
             | 
        ||
| return alias ? alias[0].replace("*", "") : undefined | ||
| return alias ? alias[0].replace(/\*/g, "") : undefined | ||
| } | ||
| 
             | 
        ||
| export async function generateTypescriptNextJS( | 
fa2f9dc    to
    f37745b      
    Compare
  
    introduces a second server template, `typescript-express` **Tasks** - [x] Template - [x] Runtime - [x] Integration tests - [x] Existing E2E tests - [x] Additional E2E tests - [x] Documentation - [x] Review **Why Express** `express` is one of the most popular server frameworks for NodeJS, getting approximately 10x as many weekly downloads as `koa` Its also quite similar to `koa` making it a good candidate for the second server template. This makes it somewhat less interesting to implement, compared to other options like `nextjs` (#152) but also means that its a good way to prompt refactors like #316 without requiring a bunch of new functionality. **Runtime** It's clear at this point that there is a lot of duplicated code between all the runtimes. I like keeping the separate runtime packages for several reasons: - Dependency declaration / management is cleaner - NPM download trends can function as a rough proxy for adoption / usage _(although private caching registries cause this to under-report significantly)_ It probably makes sense to introduce a `typescript-runtime-common` package soon. **Approach** The approach ends up looking near identical to the `typescript-koa` template, in terms of the end developer experience. This is particularly reinforced by the E2E tests and how little difference exists between the two implementations.
a1a0a6a    to
    b075b59      
    Compare
  
    - upgrade all dependencies - regenerate with latest nextjs generator from mnahkies/openapi-code-generator#152 - adjust for nextjs 15
b075b59    to
    1876c5e      
    Compare
  
    f61f814    to
    3684213      
    Compare
  
    required in order to use the latest version of `ts-morph` over in #152
da3921c    to
    36635f0      
    Compare
  
    
Creates a new
typescript-nextjstemplate./src/generatedcontaining the types and validation boilerplateApproach
Due to the NextJS file based routing paradigm I couldn't see anyway to avoid manipulating files that will contain manually written code.
Pending Refactoring
Currently there is a lot of duplicated code between this and the
typescript-koatemplate which needs rationalizing, as well as it depending on thetypescript-koa-runtimepackage. Part of the motivation behind this is to have more than one server template to allow it to become more generic like the client templates.Because of the
typescript-koa-runtimehack, to actually use this in a NextJS application you need to add the following to yournext.config.mjs:I also don't love the explosion of files this creates when running the standard set of integration suites, and might limit the scope down to one spec to reduce the noise. Ideally I'd like to separate the integration tests to their own repo and also start testing more permutations of options (eg:
joi,extract-inline-schemas).Additionally to make multiple suites play nicely I've had to fudge the output paths in the tests, technically producing incorrect routes.
Performance
I've been told that
ts-morphcan be relatively slow, so it's probably useful to check the performance between this andtypescript-koaOverall it looks similar, aside from calculation of the dependency graph. I'm not sure if this is the bug in the timing code, or if the larger number of compilation units is somehow causing this. Warrants some investigation in case we're calculating it repeatedly or something.
typescript-nextjs - api.github.com.yaml
typescript-koa - api.github.com.yaml